import { defineConfig, loadEnv } from 'vite'
import path from 'path'
import vue from '@vitejs/plugin-vue'

import autoImport from './vite/plugin/autoImport.js'
import mockPlugin from './vite/plugin/mockPlugin.js'

export default ({ mode }) => {
  // mode就是执行npm run 命令时--mode后面的参数，如：vite --mode development-sz
  // process.cwd()是当前Node.js进程执行时的文件夹地址
  const env = loadEnv(mode, process.cwd()) // 获取.env文件里定义的环境变量

  return defineConfig({
    base: env.VITE_BASE_URL || '/',
    server: {
      port: 3001,
      host: '0.0.0.0',
      // open: true,
      proxy: {
        '/dev-api/': {
          target: 'http:127.0.0.1:8080',
          rewrite: (path) => path.replace(/^\/dev-api/, ''),
          changeOrigin: true,
        },
      },
    },
    resolve: {
      alias: {
        // 配置资源路径
        '@/': `${path.resolve(__dirname, 'src')}/`,
      },
    },
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@use "@/assets/theme/index.scss" as *;`, // 自定义的主题色
          charset: false, // 禁止项目scss添加@charset:UTF-8
        },
      },
    },
    plugins: [
      vue(),
      ...autoImport(),
      mockPlugin(env.VITE_USE_MOCK),
    ],
    build: {
      //terser 和 esbuild 两种打包的方式，esbuild速度快，terser速度慢体积小
      minify: 'terser',
      // 生产环境清除console和debugger
      terserOptions: {
        compress: {
          drop_console: true,
          drop_debugger: true,
        },
      },

      rollupOptions: {
        output: {
          // 最小化拆分包
          manualChunks: (id, { getModuleInfo }) => {
            if (id.includes('node_modules')) {
              // node_modules文件夹下 都单独打包
              return id.toString().split('node_modules/')[1].split('/')[0].toString()
            } else if (
              getModuleInfo(id).importers.length + getModuleInfo(id).dynamicImporters.length > 1 &&
              id.includes('src')
            ) {
              // src文件夹下 静态、动态引入被多个模块引入则合包到manifest
              return 'manifest'
            }
          },
          // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
          entryFileNames: 'assets/js/[name].[hash].js',
          // 用于命名代码拆分时创建的共享块的输出命名
          // chunkFileNames: 'assets/js/[name].[hash].js',
          // 用于输出静态资源的命名，[ext]表示文件扩展名
          assetFileNames: 'assets/[ext]/[name].[hash].[ext]',
          // 拆分js到模块文件夹
          // chunkFileNames: (chunkInfo) => {
          //     const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split('/') : [];
          //     const fileName = facadeModuleId[facadeModuleId.length - 2] || '[name]';
          //     return `js/${fileName}/[name].[hash].js`;
          // },
        },
      },
    },
  })
}
